{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0484af03-655d-4607-98b1-ce28323de097",
   "metadata": {},
   "source": [
    "案例需求 \r\n",
    "本案例设计的主要目的在于，结合所学的分组聚合的知识，将统计的奥运会参\r\n",
    "人员基本信息进行归类，筛选出所有篮球运动员的基本信息，以统计篮球运员\r\n",
    "的如下几个测试指标：\r\n",
    "(1)统计篮球运动员的平均年龄、身高、体重。\r\n",
    "(2)统计男篮运动员的年龄、身高、体重的极差值。\r\n",
    "(3)统计篮球运动员的体质指数( BMI 值)。\r\n",
    "上述统计指标值的获取，都需要利用Pandas的分组与聚合方roup])['a']Pandas中应用在分组的方法有很多种，所以在进行聚操作时，会对比多个方\r\n",
    "法的特点综合选择，从而帮助大家更地理解和运用这些方法。\r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0895d7fe-1812-41b1-94bb-495216962e40",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       姓名 性别 出生年份（年）  年龄（岁）  身高(cm)  体重(kg)      项目     省份\n",
      "0     陈楠   女   1983年     35     197      90      篮球    山东省\n",
      "1    白发全   男   1986年     32     175      64    铁人三项    云南省\n",
      "2    陈晓佳   女   1988年     30     180      70      篮球    江苏省\n",
      "3     陈倩   女   1987年     31     163      54  女子现代五项  江苏省  \n",
      "4    曹忠荣   男   1981年     37     180      73  男子现代五项    上海市\n",
      "..    ... ..     ...    ...     ...     ...     ...    ...\n",
      "174  赵芸蕾   女   1986年     32     173      62     羽毛球    湖北省\n",
      "175   周琦   男   1996年     22     217      95      篮球   河南省 \n",
      "176  翟晓川   男   1993年     25     204     100      篮球   河北省 \n",
      "177  赵继伟   男   1995年     23     185      77      篮球    辽宁省\n",
      "178  邹雨宸   男   1996年     22     208     108      篮球    辽宁省\n",
      "\n",
      "[179 rows x 8 columns]\n",
      "        姓名 性别 出生年份（年）  年龄（岁）  身高(cm)  体重(kg)  项目        省份\n",
      "0      陈楠   女   1983年     35     197      90  篮球       山东省\n",
      "2     陈晓佳   女   1988年     30     180      70  篮球       江苏省\n",
      "16   丁彦雨航   男   1993年     25     200      91  篮球  新疆维吾尔自治区\n",
      "23     高颂   女   1992年     26     191      85  篮球    黑龙江省  \n",
      "28    郭艾伦   男   1993年     25     192      85  篮球       辽宁省\n",
      "35    黄红枇   女   1989年     29     195      80  篮球   广西壮族自治区\n",
      "42    黄思静   女   1996年     22     192      80  篮球       广东省\n",
      "48    李慕豪   男   1992年     26     225     111  篮球      贵州贵阳\n",
      "54    李珊珊   女   1987年     31     177      70  篮球     江苏省  \n",
      "73     露雯   女   1990年     28     191      78  篮球    内蒙古自治区\n",
      "101   孙梦然   女   1992年     26     197      77  篮球       天津市\n",
      "102   孙梦昕   女   1993年     25     190      77  篮球     山东省  \n",
      "106    睢冉   男   1992年     26     192      95  篮球       山西省\n",
      "116    吴迪   女   1990年     28     186      72  篮球       天津市\n",
      "124   王哲林   男   1994年     24     214     110  篮球      福建省 \n",
      "155   易建联   男   1987年     31     213     113  篮球       广东省\n",
      "161    周鹏   男   1989年     29     206      90  篮球       辽宁省\n",
      "175    周琦   男   1996年     22     217      95  篮球      河南省 \n",
      "176   翟晓川   男   1993年     25     204     100  篮球      河北省 \n",
      "177   赵继伟   男   1995年     23     185      77  篮球       辽宁省\n",
      "178   邹雨宸   男   1996年     22     208     108  篮球       辽宁省\n",
      "        年龄（岁）      身高(cm)     体重(kg)\n",
      "性别                                  \n",
      "女   28.000000  189.600000  77.900000\n",
      "男   25.272727  205.090909  97.727273\n",
      "         年龄（岁）      身高(cm)     体重(kg)\n",
      "0    28.000000  189.600000  77.900000\n",
      "2    28.000000  189.600000  77.900000\n",
      "16   25.272727  205.090909  97.727273\n",
      "23   28.000000  189.600000  77.900000\n",
      "28   25.272727  205.090909  97.727273\n",
      "35   28.000000  189.600000  77.900000\n",
      "42   28.000000  189.600000  77.900000\n",
      "48   25.272727  205.090909  97.727273\n",
      "54   28.000000  189.600000  77.900000\n",
      "73   28.000000  189.600000  77.900000\n",
      "101  28.000000  189.600000  77.900000\n",
      "102  28.000000  189.600000  77.900000\n",
      "106  25.272727  205.090909  97.727273\n",
      "116  28.000000  189.600000  77.900000\n",
      "124  25.272727  205.090909  97.727273\n",
      "155  25.272727  205.090909  97.727273\n",
      "161  25.272727  205.090909  97.727273\n",
      "175  25.272727  205.090909  97.727273\n",
      "176  25.272727  205.090909  97.727273\n",
      "177  25.272727  205.090909  97.727273\n",
      "178  25.272727  205.090909  97.727273\n",
      "        姓名 性别 出生年份（年）  年龄（岁）  身高(cm)  体重(kg)  项目        省份  年龄（岁）_mean  \\\n",
      "0      陈楠   女   1983年     35     197      90  篮球       山东省   28.000000   \n",
      "2     陈晓佳   女   1988年     30     180      70  篮球       江苏省   28.000000   \n",
      "16   丁彦雨航   男   1993年     25     200      91  篮球  新疆维吾尔自治区   25.272727   \n",
      "23     高颂   女   1992年     26     191      85  篮球    黑龙江省     28.000000   \n",
      "28    郭艾伦   男   1993年     25     192      85  篮球       辽宁省   25.272727   \n",
      "35    黄红枇   女   1989年     29     195      80  篮球   广西壮族自治区   28.000000   \n",
      "42    黄思静   女   1996年     22     192      80  篮球       广东省   28.000000   \n",
      "48    李慕豪   男   1992年     26     225     111  篮球      贵州贵阳   25.272727   \n",
      "54    李珊珊   女   1987年     31     177      70  篮球     江苏省     28.000000   \n",
      "73     露雯   女   1990年     28     191      78  篮球    内蒙古自治区   28.000000   \n",
      "101   孙梦然   女   1992年     26     197      77  篮球       天津市   28.000000   \n",
      "102   孙梦昕   女   1993年     25     190      77  篮球     山东省     28.000000   \n",
      "106    睢冉   男   1992年     26     192      95  篮球       山西省   25.272727   \n",
      "116    吴迪   女   1990年     28     186      72  篮球       天津市   28.000000   \n",
      "124   王哲林   男   1994年     24     214     110  篮球      福建省    25.272727   \n",
      "155   易建联   男   1987年     31     213     113  篮球       广东省   25.272727   \n",
      "161    周鹏   男   1989年     29     206      90  篮球       辽宁省   25.272727   \n",
      "175    周琦   男   1996年     22     217      95  篮球      河南省    25.272727   \n",
      "176   翟晓川   男   1993年     25     204     100  篮球      河北省    25.272727   \n",
      "177   赵继伟   男   1995年     23     185      77  篮球       辽宁省   25.272727   \n",
      "178   邹雨宸   男   1996年     22     208     108  篮球       辽宁省   25.272727   \n",
      "\n",
      "     身高(cm)_mean  体重(kg)_mean  \n",
      "0     189.600000    77.900000  \n",
      "2     189.600000    77.900000  \n",
      "16    205.090909    97.727273  \n",
      "23    189.600000    77.900000  \n",
      "28    205.090909    97.727273  \n",
      "35    189.600000    77.900000  \n",
      "42    189.600000    77.900000  \n",
      "48    205.090909    97.727273  \n",
      "54    189.600000    77.900000  \n",
      "73    189.600000    77.900000  \n",
      "101   189.600000    77.900000  \n",
      "102   189.600000    77.900000  \n",
      "106   205.090909    97.727273  \n",
      "116   189.600000    77.900000  \n",
      "124   205.090909    97.727273  \n",
      "155   205.090909    97.727273  \n",
      "161   205.090909    97.727273  \n",
      "175   205.090909    97.727273  \n",
      "176   205.090909    97.727273  \n",
      "177   205.090909    97.727273  \n",
      "178   205.090909    97.727273  \n",
      "...........................................................\n",
      "        姓名 性别 出生年份（年）  年龄（岁）  身高(cm)  体重(kg)  项目        省份\n",
      "16   丁彦雨航   男   1993年     25     200      91  篮球  新疆维吾尔自治区\n",
      "28    郭艾伦   男   1993年     25     192      85  篮球       辽宁省\n",
      "48    李慕豪   男   1992年     26     225     111  篮球      贵州贵阳\n",
      "106    睢冉   男   1992年     26     192      95  篮球       山西省\n",
      "124   王哲林   男   1994年     24     214     110  篮球      福建省 \n",
      "155   易建联   男   1987年     31     213     113  篮球       广东省\n",
      "161    周鹏   男   1989年     29     206      90  篮球       辽宁省\n",
      "175    周琦   男   1996年     22     217      95  篮球      河南省 \n",
      "176   翟晓川   男   1993年     25     204     100  篮球      河北省 \n",
      "177   赵继伟   男   1995年     23     185      77  篮球       辽宁省\n",
      "178   邹雨宸   男   1996年     22     208     108  篮球       辽宁省\n",
      "............................................................\n",
      "        姓名 性别 出生年份（年）  年龄（岁）  身高(cm)  体重(kg)  项目        省份  体质指数\n",
      "0      陈楠   女   1983年     35     197      90  篮球       山东省     0\n",
      "2     陈晓佳   女   1988年     30     180      70  篮球       江苏省     0\n",
      "16   丁彦雨航   男   1993年     25     200      91  篮球  新疆维吾尔自治区     0\n",
      "23     高颂   女   1992年     26     191      85  篮球    黑龙江省       0\n",
      "28    郭艾伦   男   1993年     25     192      85  篮球       辽宁省     0\n",
      "35    黄红枇   女   1989年     29     195      80  篮球   广西壮族自治区     0\n",
      "42    黄思静   女   1996年     22     192      80  篮球       广东省     0\n",
      "48    李慕豪   男   1992年     26     225     111  篮球      贵州贵阳     0\n",
      "54    李珊珊   女   1987年     31     177      70  篮球     江苏省       0\n",
      "73     露雯   女   1990年     28     191      78  篮球    内蒙古自治区     0\n",
      "101   孙梦然   女   1992年     26     197      77  篮球       天津市     0\n",
      "102   孙梦昕   女   1993年     25     190      77  篮球     山东省       0\n",
      "106    睢冉   男   1992年     26     192      95  篮球       山西省     0\n",
      "116    吴迪   女   1990年     28     186      72  篮球       天津市     0\n",
      "124   王哲林   男   1994年     24     214     110  篮球      福建省      0\n",
      "155   易建联   男   1987年     31     213     113  篮球       广东省     0\n",
      "161    周鹏   男   1989年     29     206      90  篮球       辽宁省     0\n",
      "175    周琦   男   1996年     22     217      95  篮球      河南省      0\n",
      "176   翟晓川   男   1993年     25     204     100  篮球      河北省      0\n",
      "177   赵继伟   男   1995年     23     185      77  篮球       辽宁省     0\n",
      "178   邹雨宸   男   1996年     22     208     108  篮球       辽宁省     0\n",
      "        姓名 性别 出生年份（年）  年龄（岁）  身高(cm)  体重(kg)  项目        省份       体质指数\n",
      "0      陈楠   女   1983年     35     197      90  篮球       山东省  23.190497\n",
      "2     陈晓佳   女   1988年     30     180      70  篮球       江苏省  21.604938\n",
      "16   丁彦雨航   男   1993年     25     200      91  篮球  新疆维吾尔自治区  22.750000\n",
      "23     高颂   女   1992年     26     191      85  篮球    黑龙江省    23.299800\n",
      "28    郭艾伦   男   1993年     25     192      85  篮球       辽宁省  23.057726\n",
      "35    黄红枇   女   1989年     29     195      80  篮球   广西壮族自治区  21.038790\n",
      "42    黄思静   女   1996年     22     192      80  篮球       广东省  21.701389\n",
      "48    李慕豪   男   1992年     26     225     111  篮球      贵州贵阳  21.925926\n",
      "54    李珊珊   女   1987年     31     177      70  篮球     江苏省    22.343516\n",
      "73     露雯   女   1990年     28     191      78  篮球    内蒙古自治区  21.380993\n",
      "101   孙梦然   女   1992年     26     197      77  篮球       天津市  19.840759\n",
      "102   孙梦昕   女   1993年     25     190      77  篮球     山东省    21.329640\n",
      "106    睢冉   男   1992年     26     192      95  篮球       山西省  25.770399\n",
      "116    吴迪   女   1990年     28     186      72  篮球       天津市  20.811655\n",
      "124   王哲林   男   1994年     24     214     110  篮球      福建省   24.019565\n",
      "155   易建联   男   1987年     31     213     113  篮球       广东省  24.906875\n",
      "161    周鹏   男   1989年     29     206      90  篮球       辽宁省  21.208408\n",
      "175    周琦   男   1996年     22     217      95  篮球      河南省   20.174563\n",
      "176   翟晓川   男   1993年     25     204     100  篮球      河北省   24.029220\n",
      "177   赵继伟   男   1995年     23     185      77  篮球       辽宁省  22.498174\n",
      "178   邹雨宸   男   1996年     22     208     108  篮球       辽宁省  24.963018\n",
      ".............................\n",
      "        姓名 性别 出生年份（年）  年龄（岁）  身高(cm)  体重(kg)  项目        省份       体质指数\n",
      "0      陈楠   女   1983年     35     197      90  篮球       山东省  23.190497\n",
      "2     陈晓佳   女   1988年     30     180      70  篮球       江苏省  21.604938\n",
      "16   丁彦雨航   男   1993年     25     200      91  篮球  新疆维吾尔自治区  22.750000\n",
      "23     高颂   女   1992年     26     191      85  篮球    黑龙江省    23.299800\n",
      "28    郭艾伦   男   1993年     25     192      85  篮球       辽宁省  23.057726\n",
      "35    黄红枇   女   1989年     29     195      80  篮球   广西壮族自治区  21.038790\n",
      "42    黄思静   女   1996年     22     192      80  篮球       广东省  21.701389\n",
      "48    李慕豪   男   1992年     26     225     111  篮球      贵州贵阳  21.925926\n",
      "54    李珊珊   女   1987年     31     177      70  篮球     江苏省    22.343516\n",
      "73     露雯   女   1990年     28     191      78  篮球    内蒙古自治区  21.380993\n",
      "101   孙梦然   女   1992年     26     197      77  篮球       天津市  19.840759\n",
      "102   孙梦昕   女   1993年     25     190      77  篮球     山东省    21.329640\n",
      "106    睢冉   男   1992年     26     192      95  篮球       山西省  25.770399\n",
      "116    吴迪   女   1990年     28     186      72  篮球       天津市  20.811655\n",
      "124   王哲林   男   1994年     24     214     110  篮球      福建省   24.019565\n",
      "155   易建联   男   1987年     31     213     113  篮球       广东省  24.906875\n",
      "161    周鹏   男   1989年     29     206      90  篮球       辽宁省  21.208408\n",
      "175    周琦   男   1996年     22     217      95  篮球      河南省   20.174563\n",
      "176   翟晓川   男   1993年     25     204     100  篮球      河北省   24.029220\n",
      "177   赵继伟   男   1995年     23     185      77  篮球       辽宁省  22.498174\n",
      "178   邹雨宸   男   1996年     22     208     108  篮球       辽宁省  24.963018\n"
     ]
    }
   ],
   "source": [
    "# coding:UTF-8\n",
    "import pandas as pd\n",
    "# 读取奥林匹克参赛人员信息表\n",
    "df = pd.read_csv('./data/运动员信息表.csv',encoding='gbk')\n",
    "print(df)\n",
    "\n",
    "\n",
    "\n",
    "# 按项目一列进行分组\n",
    "data_group = df.groupby('项目')\n",
    "# 输出篮球分组的信息\n",
    "df_basketball = dict([x for x in data_group])['篮球']\n",
    "print(df_basketball)\n",
    "\n",
    "\n",
    "\n",
    "# 1、统计男篮、女篮的平均年龄、身高、体重\n",
    "'''\n",
    "如果希望统计男篮与女篮运动员的平均年龄、平均身高及平均体重，那么需要在df_basketball 分组的基础上，\n",
    "再根据“性别”一列进行分组，之后对每个分组应用mean方法求平均值，\n",
    "'''\n",
    "\n",
    "# 按性别一列进行分组，并使用聚合方法\n",
    "# 只选择数值型列进行均值计算\n",
    "numeric_columns = ['年龄（岁）','身高(cm)','体重(kg)']\n",
    "groupby_sex = df_basketball.groupby('性别')[numeric_columns].mean()\n",
    "print(groupby_sex)\n",
    "\n",
    "# 如果希望运算结果与 df_basketball 具有相同的大小( shape ),即具有相同的行数列数\n",
    "# 使用tranform将数据进行聚合，并利用其特性将平均值进行guangbo\n",
    "info = df_basketball.groupby('性别')[numeric_columns].transform('mean')\n",
    "print(info)\n",
    "\n",
    "# 将info添加到原始的篮球分组dataframe中\n",
    "df_basketball_with_mean = df_basketball.copy()\n",
    "for col in numeric_columns:\n",
    "    df_basketball_with_mean[f'{col}_mean'] = info[col]\n",
    "print(df_basketball_with_mean)\n",
    "\n",
    "\n",
    "\n",
    "print('...........................................................')\n",
    "# 2.统计男篮运动员年龄、身高、体重的极差值\n",
    "# 查看男篮运动员分组\n",
    "basketball_male = df_basketball[df_basketball['性别']=='男']\n",
    "print(basketball_male)\n",
    "\n",
    "# Pandas的 DataFrame 类中没有提供计算极差的方法,需要自定义一个计算极差的函数\n",
    "def range_datagroup(arr):\n",
    "    return arr.max() - arr.min()\n",
    "# 求年龄、身高、体重这三组数据的极差值\n",
    "basketball_male.agg({'年龄（岁）':range_datagroup,'身高(cm)':range_datagroup,\n",
    "                    '体重(kg)':range_datagroup})\n",
    "\n",
    "\n",
    "print('............................................................')\n",
    "# 3.统计男篮运动员的体质指数\n",
    "'''\n",
    "体质指数( BMI )=体重(kg)÷身高^2(m)\n",
    "根据世界卫生组织定下的标准，亚洲人的 BMI 若高于22.9便属于过重。亚洲人和欧美人属于不同人种，\n",
    "WHO的标准不是非常适合中国人的情况，为此制定了中国参考标准\n",
    "'''\\\n",
    "# 在df_basketball的基础上添加一列数据，列索引为体质指数，数据初始值为0\n",
    "df_basketball['体质指数'] = 0\n",
    "print(df_basketball)\n",
    "\n",
    "# 计算bmi值的函数\n",
    "def calculate_bmi(weight,height):\n",
    "    return weight / (height / 100)**2\n",
    "\n",
    "# 计算并更新体质指数列\n",
    "df_basketball['体质指数'] = calculate_bmi(df_basketball['体重(kg)'],df_basketball['身高(cm)'])\n",
    "print(df_basketball)\n",
    "print('.............................')\n",
    "\n",
    "\n",
    "\n",
    "# 这难道不多余吗\n",
    "# 这里，我们使用 apply() 方法将自定义的函数应用到“体质指数”一列\n",
    "# 假设自定义函数outer处理体质指数\n",
    "def outer(bmi):\n",
    "    # 这里返回原来的bmi值\n",
    "    return bmi\n",
    "# 使用apply方法将自定义的函数应用到体质指数列\n",
    "df_basketball['体质指数'] = df_basketball['体质指数'].apply(outer)\n",
    "print(df_basketball)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91930855-28c5-4c8f-bbcd-b903d1309c17",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
